package jm.nj.demo07main.demo02;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

/*
* 迭代器的并发修改异常:在迭代的过程中,修改了集合的长度,而迭代掐并不知道,就会发生此异常
* */
public class Demo02Iterator {
    public static void main(String[] args) {
        ArrayList<String>list = new ArrayList<String>();
        list.add("abc1");
        list.add("abc2");
        list.add("www");
        list.add("abc3");
        list.add("abc4");

       /* String s = null;
        boolean b= "www".equals(s);
        System.out.println(b);

         s = null;
        b= s.equals("www");//NullPointerException
        System.out.println(b);*/

        //使用迭代器遍历集合(多态)
       /* Iterator<String>it= list.iterator();
        while (it.hasNext()){
            String s = it.next();
            System.out.println(s);
            //使用字符判断的时候,已知的变量要写在前边
            if ("www".equals(s)){
                list.add("asd");//ConcurrentModificationException并发修改异常
            }
        }*/

        /*
        * 并发修改异常解决方法:
        *   1.迭代器只遍历,不添加
        *   2.使用迭代器Iterator的子接口ListIterator中的方法增删元素
        *       LIstIterator是List集合才可以使用的迭代器,set集合无法使用
        *       ListIterator有专门增删元素的方法,迭代器使用自己的方法增加/删除,迭代器知道就不会报异常
        *               void add (E e)集合添加元素
        *               void remove()删除集合中的元素
        * */

        ListIterator<String>it = list.listIterator();
        while (it.hasNext()){
            String s= it.next();
           System.out.println(s);
            if ("www".equals(s)){
                it.add("adas");
            }
            System.out.println(s);
        }
        System.out.println(list);
    }
}
